package main

import (
	"fmt"
)

//统计一个数字在排序数组中出现的次数。
//func search(nums []int, target int) (res int) {
//	for _, val := range nums {
//		if target == val {
//			res++
//		}
//	}
//	return
//}

func search(nums []int, target int) (res int) {
	l, r := 0, len(nums)-1
	left,right:=0,0
	var m int
	for l <= r {
		m = (l + r) / 2
		if nums[m] <= target { // l 最终的位置一定是的在target的右边的哪个位置
			l = m + 1
		} else { // r 最终是大于target所在的位置，因为是改变上判断的位置,如果存在的话，r 必然指向最大的target所在的位置;
			r = m - 1
		}
	}
	right=l
	// 判断如果 target 不存在如何解决
	if r>=0 && nums[r]!=target  {
		return 0
	}
	l,r=0,len(nums)-1
	for l<=r{
		m=(l+r)/2
		if nums[m]<target {
			l=m+1
		}else {
			r=m-1
		}
	}
	left=r
	return right-left-1
}

func main() {
	nums:=[]int{5,7,7,8,8,10}
	fmt.Println(search(nums,4))
}

// 二分查找
// 二分查找的最终的结果的位置 与边界判断有关系；
// 不同的 判断值最终会的判断的位置的值的是不同的。
